import { hasChange, hasOwn, isArray, isInteger, isObject, isSymbol } from "../shared/index";
import { track, trigger } from "./effect";
import { reactive } from "./reactive";

function createGetter() {
  return function get(target,key,receiver) {

    console.log('取值了')

    const res = Reflect.get(target,key,receiver)
    // 如果取的值是symbol,要忽略
    if(isSymbol(key)) {
      return res
    }
    // 依赖收集
    track(target,key)
    if(isObject(res)) {
      return reactive(res)
    }
    return res
  }
}

function createSetter(){
  return function set(target,key,value,receiver){

    const oldValue = target[key]; // 如果是修改的话，那肯定是有老值的

    // 看一下有没有这个属性
    // 第一种是 数组新增的逻辑，第二种是对象的逻辑
    const hasKey = isArray(target) && isInteger(key) ? Number(key) < target.length : hasOwn(target,key);

    const result = Reflect.set(target,key,value,receiver);

    // 新增属性是对象，没有关系，只有取值的时候，才会做代理
    if (!hasKey) {
      trigger(target,'add',key,value)
    } else if(hasChange(value,oldValue)) {
      trigger(target,'set',key,value,oldValue)
    }

    return result
  }
}


const get = createGetter();
const set = createSetter();

export const mutableHandlers = {
  get,
  set
}